package com.newlink.building.login.common.widget

import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView

/**
 * @Author: Your Name (originally xiaodong)
 * @Date: 2025/06/29 (originally 2022/10/6)
 * @Description: 一个自定义的 TextView，用于实现倒计时功能，常用于“获取验证码”按钮。
 * 倒计时结束后会恢复原始文本并启用视图。
 */
class Module_Login_CountdownView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr), Runnable {

    /**
     * 伴生对象，用于存放常量。
     */
    companion object {
        /** 倒计时秒数单位文本。 */
        private const val TIME_UNIT: String = "S"

        /** 每次延迟执行的时间间隔，单位毫秒。 */
        private const val DELAY_MILLIS: Long = 1000L

        /** 默认倒计时总秒数。 */
        private const val DEFAULT_TOTAL_SECONDS: Int = 120
    }

    /** 倒计时总秒数。 */
    private var totalSeconds: Int = DEFAULT_TOTAL_SECONDS

    /** 当前倒计时剩余秒数。 */
    private var currentRemainingSeconds: Int = 0

    /** 记录视图开始倒计时前的原始文本。 */
    private var originalText: CharSequence? = null

    /**
     * 设置倒计时总秒数。
     * @param seconds 倒计时的总秒数。
     */
    fun setTotalTime(seconds: Int) {
        if (seconds > 0) {
            totalSeconds = seconds
        } else {
            // 可以选择抛出异常或记录日志，此处简单地使用默认值
            totalSeconds = DEFAULT_TOTAL_SECONDS
        }
    }

    /**
     * 开始倒计时。
     * - 记录当前文本作为原始文本。
     * - 禁用视图以防止重复点击。
     * - 初始化当前剩余秒数。
     * - 开始执行倒计时任务。
     */
    fun start() {
        originalText = text // 记录原始文本
        isEnabled = false // 禁用视图
        currentRemainingSeconds = totalSeconds // 初始化倒计时
        post(this) // 开始执行倒计时任务
    }

    /**
     * 停止倒计时。
     * - 将当前剩余秒数重置为0。
     * - 恢复视图的原始文本。
     * - 启用视图。
     * - 移除所有待处理的倒计时任务。
     */
    fun stop() {
        currentRemainingSeconds = 0 // 重置秒数
        text = originalText // 恢复原始文本
        isEnabled = true // 启用视图
        removeCallbacks(this) // 移除所有回调，确保停止
    }

    /**
     * 当视图从窗口分离时回调。
     * 移除所有延迟任务，避免内存泄漏。
     */
    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        stop() // 确保在视图分离时停止倒计时并清理
    }

    /**
     * Runnable 接口的实现，定义了倒计时的逻辑。
     * 每秒更新文本，直到倒计时结束。
     */
    @SuppressLint("SetTextI18n") // Suppress warning for string concatenation in setText
    override fun run() {
        if (currentRemainingSeconds <= 0) {
            stop() // 倒计时结束，停止并恢复视图
            return
        }

        currentRemainingSeconds-- // 减少剩余秒数
        text = "$currentRemainingSeconds $TIME_UNIT" // 更新文本显示

        // 延迟 1 秒后再次执行 run 方法
        postDelayed(this, DELAY_MILLIS)
    }
}